% Created 2023-03-06 周一 09:49
% Intended LaTeX compiler: xelatex
\documentclass[a4paper]{article}
                 \usepackage{graphicx}
                 \usepackage{xcolor}
                 \usepackage{xeCJK}
                 \usepackage{fixltx2e}
                 \usepackage{longtable}
                 \usepackage{float}        
                 \usepackage{tikz}         
                 \usepackage{wrapfig}      
                 \usepackage{latexsym,amssymb,amsmath}
                 \usepackage{textcomp}
                 \usepackage{bicaption}
                 \usepackage{listings}     
                \usepackage{marvosym}     
                \usepackage{textcomp}     
                \usepackage{latexsym}     
                \usepackage{natbib}
                \usepackage{indentfirst}
		\usepackage{hyperref}
                \usepackage{geometry}
                \usepackage{minted}
                \usepackage{algpseudocode}
		\usepackage{algorithm}
                \usepackage{algorithmicx}
                \setCJKmainfont{仿宋}
                \setCJKsansfont{Microsoft YaHei}
                \setCJKmonofont{Microsoft YaHei}
                \setlength{\parindent}{2em}
                \usepackage{color}
                \usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead[R]{\footnotesize{《Android应用程序开发》 广西职业师范学院实验教学指导书}}
\geometry{a4paper,left=2.5cm,right=2.5cm,top=2cm,bottom=2cm}
\setCJKmainfont{Microsoft YaHei}
\setCJKsansfont{Microsoft YaHei}
\setCJKmonofont{Microsoft YaHei}

            \lstset{
  columns=fixed,       
  breaklines=true, breakautoindent=true,breakindent=4em,
  commentstyle=\it\color[RGB]{0,96,96},                %
  stringstyle=\rmfamily\slshape\color[RGB]{128,0,0},   %
  showstringspaces=false,                              %
  language=java,                                        %
}

\usemintedstyle{emacs}
    \setminted{%
        autogobble,% automatically remove the spaces to the left of the code
        linenos=true,% show line numbers
        fontsize=\small,% smaller font size
        % escapeinside=@@,% insert latex code between @ and @
        frame=lines,% frame styles: none or lines
        % frame=none,
        numbers=none,% show line numbers on: left, right, both or none
        mathescape=true,% insert math code
	breaklines=true,
    }%
    \setmintedinline{%
        fontsize=\smallsize,
    }%
\date{\today}
\title{实验二：Android资源的使用}
\hypersetup{
 pdfauthor={},
 pdftitle={实验二：Android资源的使用},
 pdfkeywords={},
 pdfsubject={},
 pdfcreator={Emacs 27.1 (Org mode 9.3.8)}, 
 pdflang={English}}
\begin{document}

\maketitle
\tableofcontents

\newpage

\section{实验目的}
\label{sec:org6a82cef}
\begin{itemize}
\item 掌握 Android 相关资源的应用
\end{itemize}
\section{实验设备和器件}
\label{sec:org67c77a7}
\begin{itemize}
\item PC
\item 内存要求 8G 以上
\end{itemize}
\section{知识准备}
\label{sec:org00f9c43}
\subsection{字符串资源}
\label{sec:org580a0f5}
\begin{enumerate}
\item 字符串资源存放在 res/values/strings.xml 文件中；
\item 字符串资源通过一个key值索引到具体的值
\lstset{language=XML,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
<string name="key">value</string>
\end{lstlisting}
\item 调用方式:
\begin{itemize}
\item xml方式
\end{itemize}
\lstset{language=c++,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
@string/key
\end{lstlisting}
\begin{itemize}
\item java中的调用方式
\end{itemize}
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
getResources().getString(R.string.xxx);
\end{lstlisting}
\end{enumerate}
\subsection{颜色资源}
\label{sec:org91c9c39}
\begin{enumerate}
\item 颜色资源存放在 res/values/colors.xml 文件中；
\item 颜色资源通过一个key值索引到具体的值(\#RGB)
\lstset{language=XML,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
<color name="red">#ff0000</string>
\end{lstlisting}
\item 调用方式:
\begin{itemize}
\item xml方式
\end{itemize}
\lstset{language=c++,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
@color/colorname
\end{lstlisting}
\begin{itemize}
\item java中的调用方式
\end{itemize}
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
getResources().getColor(R.color.colorPrimary,null);
\end{lstlisting}
\end{enumerate}
\begin{enumerate}
\item 尺寸资源
\label{sec:org5cdf4a3}
\begin{enumerate}
\item 尺寸单位说明:
\begin{itemize}
\item in: inch(英寸),屏幕尺寸
\item pt: 1pt=1/72 in
\item px: pixel(像素单位)
\item 分辨率(Resolution)
\item dpi
\item dp: dip(device independent pixel), 设备独立无关单位；边距单位
px 与 dp 的转换关系：px=dp*（dpi/160）
\item sp: 字体大小单位，设备无关单位
\end{itemize}
\end{enumerate}
\end{enumerate}
\subsection{BaseAdapter 适配器组件}
\label{sec:orgc0ee6be}
\begin{enumerate}
\item 什么是适配器?
数据源（Data source）的格式是多种多样的，但是展示组件(如GridView、ListView)可以展示的格
式却是有一定的要求的。作为适配器(Adapter)的作用就是将数据源中多种多样
的数据格式转化为展示组件可以展示的格式，建立数据源与展示组件的一个
适配关系，比如数据源的某某格式应该对应GridView支持的某某格式。并从
中将数据的来源和数据的显示进行了解耦，降低了程序的耦合性，让程序更容易扩展。

\item BaseAdapter的使用
BaseAdapter是Android应用程序中经常用到的基础数据适配器的基类，它实
现了Adapter接口。其主要用途是将一组数据传到像ListView、Spinner、
Gallery及GridView等UI显示组件进行显示。

由于BaseAdapter是一个抽象类，所以使用BaseAdapter时必须有一个类继承
它，或者使用匿名类，
并实现它的方法。BaseAdapter的灵活性就在其要重写的很多方法，常会重写的
几个方法如下:
\begin{itemize}
\item int getCount()：主要是获得列表项的数量。
\item Object getItem(int position)：主要是获得当前列表项。
\item long getItemId(int position)：主要是获得当前列表项的ID。
\item View getView(int position, View convertView, ViewGroup parent)：主要是获得第position处的列表项组件。
\end{itemize}
\end{enumerate}

\section{实验内容}
\label{sec:org75fb99b}
\subsection{字符串、颜色等资源应用实训}
\label{sec:orga916ace}
\begin{enumerate}
\item 实验步骤
\label{sec:orga192a47}
\begin{itemize}
\item 在Android Studio中新建空白项目，并将其命名为ValuesResDemo。
\item 在res目录下完成颜色资源文件colors.xml、字符串资源文件strings.xml
以及尺寸资源文件dimens.xml的定义。
\item 添加控件，完成layout目录下布局文件。
\item 对Java文件进行功能增加，完成代码。
\item 颜色资源文件color.xml关键代码如下图所示
\begin{figure}[htbp]
\centering
\includegraphics[width=0.5\textwidth]{./img/screenshot_20220330_222720.png}
\caption{color.xml}
\end{figure}
\item 字符串资源文件stings.xml的关键代码如下:
\lstset{language=XML,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
<?xml version="1.0" encodng="utf-8"?>
<resources>
  <string name="app_name">字符串、颜色、尺寸资源</string>
  <string name="c1">F00</string>
  <string name="c2">0F0</string>
  <string name="c3">00F</string>
  <string name="c4">0FF</string>
  <string name="c5">F0F</string>
  <string name="c6">FF0</string>
  <string name="c7">07F</string>
  <string name="c8">70F</string>
  <string name="c9">F70</string>
</resources>
\end{lstlisting}
\item 添加尺寸资源，尺寸资源关键代码如下:
\lstset{language=XML,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <dimen name="spacing">8dp</dimen>
  <!-- 定义GridView组件中每个单元格的宽度、高度 -->
  <dimen name="cell_width">60dp</dimen>
  <dimen name="cell_height">66dp</dimen>
  <!-- 定义主程序的标题的字体大小 -->
  <dimen name="title_font_size">18sp</dimen>
</resources>
\end{lstlisting}
\item 布局文件activity\_main.xml关键代码如下:
\lstset{language=XML,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/app_name"
    android:layout_gravity="center_horizontal"
    android:textSize="@dimen/title_font_size"/>
<GridView
    android:id="@+id/grid01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:horizontalSpacing="@dimen/spacing"
    android:verticalSpacing="@dimen/spacing"
    android:numColumns="3"
    android:gravity="center">
\end{lstlisting}

\item 在后台相应的 Activity 添加如下关键成变量，      
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
// 定义字符串资源数组，直接定义
int[] textIds = new int[]
	{
		R.string.c1 , R.string.c2 , R.string.c3 ,
		R.string.c4 , R.string.c5 , R.string.c6 ,
		R.string.c7 , R.string.c8 , R.string.c9
	};
// 定义颜色资源数组，使用了colors.xml中定义的资源
int[] colorIds = new int[]
	{
		R.color.c1 , R.color.c2 , R.color.c3 ,
		R.color.c4 , R.color.c5 , R.color.c6 ,
		R.color.c7 , R.color.c8 , R.color.c9
	};

\end{lstlisting}
\begin{itemize}
\item 在后台 Activity 里相应的 onCreate 函数里添加以下相应的关键代码，
注意，一些类你需要自行导入，Android Studio 可以使用 Enter + Alt
组合键将没有导入的类自动导入
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
// 创建一个BaseAdapter对象
BaseAdapter ba = new BaseAdapter()
    {
	@Override
	public int getCount()
	{
	    // 返回值就是字符串资源的长度（一共包含9个选项）
	    return textIds.length;
	}
	@Override
	public Object getItem(int position)
	{
	    // 返回指定位置的字符串文本值
	    return getResources().getText(textIds[position]);
	}
	@Override
	public long getItemId(int position)
	{
	    return position;
	}
	// 重写该方法，该方法返回的View将作为GridView的每个格子
	@Override
	public View getView(int position
			    , View convertView, ViewGroup parent)
	{
	    TextView text = new TextView(MainActivity.this);
	    Resources res = MainActivity.this.getResources();
	    // 使用尺度资源来设置文本框的高度、宽度
	    text.setWidth(60);
	    text.setHeight((int) res.getDimension(R.dimen.cell_height));
	    // 使用字符串资源设置文本框的内容
	    text.setText(textIds[position]);
	    // 使用颜色资源来设置文本框的背景色，注意下面两种方法等效
	    text.setBackgroundResource(colorIds[position]);
	    text.setTextSize(20);
	    return text;
	}
    };
GridView grid = (GridView)findViewById(R.id.grid01);
// 为GridView设置Adapter
grid.setAdapter(ba);
\end{lstlisting}
\end{itemize}
\end{itemize}
\end{enumerate}
\subsection{程序运行及效果}
\label{sec:org11832c7}
\begin{itemize}
\item 编译工程，并在自己的手机上运行，查看运行的效果
\end{itemize}
\subsection{提交实验报告}
\label{sec:orgd644ecd}
\begin{itemize}
\item 提交：按照实验报告模板截图并填写相关的实验说明、实验总结，提交到
学习通上
\item 实验报告的提交组长提交即可，但每个同学都要做实验，组长可以将该小
组做的最好的实验提交
\end{itemize}
\end{document}